package com.game.frame.GameFrame.GameFrameMain;

import com.game.frame.LoginFrame;
import com.game.frame.MyFrame;
import com.game.init.Main;
import com.game.utils.DataBaseUtil;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * GameWindow 类负责创建和管理游戏窗口
 * 它使用 JFrame 来创建窗口，并包含一个 GamePanel 用于游戏渲染和逻辑处理
 */
public class GameWindow {
    // JFrame 实例，用于创建窗口
    private final JFrame window;
    // GamePanel 实例，用于游戏的主要渲染和逻辑处理
    private final GamePanel gamePanel;
    // 角色实例
    private Hero mainCharacter;
    // 添加野兽属性
    private List<Beast> beasts = new ArrayList<>();

    // 关卡相关
    private int currentLevel = 1;
    private static final int MAX_LEVEL = 4;  // 总共4个背景
    private boolean isLevelCompleted = false;
    private static final int BEASTS_PER_LEVEL = 3;  // 每关的野兽数量

    private ExecutorService executorService = Executors.newSingleThreadExecutor(); // 声明并初始化线程池
    /**
     * 构造方法，初始化游戏窗口
     *
     * @param width  窗口宽度
     * @param height 窗口高度
     * @param title  窗口标题
     */
    public GameWindow(int width, int height, String title) {
        // 创建 JFrame 实例并设置窗口标题
        window = new JFrame(title);
        // 创建 GamePanel 实例
        gamePanel = new GamePanel(width, height, this);

        // 播放背景音乐
        playBackgroundMusic();

        // 创建主角色
        mainCharacter = new Hero(gamePanel, 0, 300, getGameCore());
        // 将主角色添加到游戏面板
        gamePanel.addCharacter(mainCharacter);

        // 创建并添加键盘监听器
        GameKeyListener keyListener = new GameKeyListener(gamePanel, mainCharacter);
        window.addKeyListener(keyListener);  // 将监听器添加到窗口

        // 确保窗口可以获得焦点
        window.setFocusable(true);
        window.requestFocus();

        // 初始化第一关
        setBackground(currentLevel);
        // 初始化第一关的野兽
        spawnBeastsForCurrentLevel();

        // 设置窗口关闭操作，当用户关闭窗口时退出应用程序
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 禁止窗口大小调整，以防止游戏画面变形
        window.setResizable(false);
        // 将 GamePanel 添加到窗口中
        window.add(gamePanel);
        // 调整窗口大小以适应其内容
        window.pack();
        // 将窗口位置设置为屏幕中央
        window.setLocationRelativeTo(null);
    }

    public GameCore getGameCore() {
        return gamePanel.getGameCore();
    }

    /**
     * 为当前关卡生成野兽
     */
    private void spawnBeastsForCurrentLevel() {
        clearBeasts(); // 清理现有的野兽
        for (int i = 0; i < BEASTS_PER_LEVEL; i++) {
            Beast beast = new Beast(gamePanel);
            beasts.add(beast);
            gamePanel.addBeast(beast);
        }
        isLevelCompleted = false;
    }

    /**
     * 清理所有野兽
     */
    private void clearBeasts() {
        beasts.clear();
        gamePanel.clearBeasts();
        System.gc(); // 建议垃圾回收
    }

    /**
     * 处理场景切换
     * @param isMovingRight true表示向右移动，false表示向左移动
     */
    public void handleSceneChange(boolean isMovingRight) {
        if (isMovingRight) {
            if (currentLevel < MAX_LEVEL) {
                // 进入下一关
                currentLevel++;
                setBackground(currentLevel);
                // 生成新关卡的野兽
                spawnBeastsForCurrentLevel();
            } else {
                // 游戏通关
                handleGameComplete();
            }
        } else {
            if (currentLevel > 1) {
                currentLevel--;
                setBackground(currentLevel);
                // 生成新关卡的野兽
                spawnBeastsForCurrentLevel();
            }
        }
    }

    /**
     * 处理游戏通关
     */
    private void handleGameComplete() {
        JOptionPane.showMessageDialog(window, "恭喜你，完成所有关卡！游戏通关！", "游戏通关", JOptionPane.INFORMATION_MESSAGE);
        
        // 上传分数
        executorService.submit(() -> {
            String time = String.valueOf(gamePanel.getGameCore().getGameTime());    
            String score = String.valueOf(gamePanel.getGameCore().getScore());      
            if (DataBaseUtil.changeScore(Main.getUserName(), time, score)) {
                SwingUtilities.invokeLater(() -> {
                    JOptionPane.showMessageDialog(null, "分数上传成功！", "分数上传", JOptionPane.INFORMATION_MESSAGE);
                });
            } else {
                SwingUtilities.invokeLater(() -> {
                    JOptionPane.showMessageDialog(null, "分数上传失败！", "分数上传", JOptionPane.ERROR_MESSAGE);
                });
            }
        });

        // 询问是否重新开始游戏
        int option = JOptionPane.showConfirmDialog(window, "是否重新开始游戏？", "游戏结束", JOptionPane.YES_NO_OPTION);
        if (option == JOptionPane.YES_OPTION) {
            resetGame();
        } else {
            window.dispose();
            Main.setStatus(0);
        }
    }

    /**
     * 获取当前关卡
     */
    public int getCurrentLevel() {
        return currentLevel;
    }

    /**
     * 重置游戏
     */
    public void resetGame() {
        currentLevel = 1;
        setBackground(currentLevel);
        clearBeasts();
        spawnBeastsForCurrentLevel();
        mainCharacter = new Hero(gamePanel, 0, 300, getGameCore());
        gamePanel.clearCharacters();
        gamePanel.addCharacter(mainCharacter);
    }

    /**
     * 设置背景图片的方法
     *
     * @param bgIndex 背景图片的索引
     */
    public void setBackground(int bgIndex) {
        // 调用 GamePanel 的 setBackgroundImage 方法
        gamePanel.setBackgroundImage(bgIndex);
    }

    /**
     * 显示游戏窗口
     */
    public void show() {
        // 设置窗口可见
        window.setVisible(true);
    }

    /**
     * 获取 GamePanel 实例
     *
     * @return GamePanel 实例
     */
    public GamePanel getGamePanel() {
        return gamePanel;
    }

    /**
     * 获取主角角色实例
     *
     * @return 主角角色实例
     */
    public Hero getMainCharacter() {
        return mainCharacter;
    }

    /**
     * 添加播放背景音乐的方法
     */
    public void playBackgroundMusic() {
        com.game.utils.StaticValue.playBackgroundMusic();
    }

    /**
     * 添加停止背景音乐的方法
     */
    public void stopBackgroundMusic() {
        com.game.utils.StaticValue.stopBackgroundMusic();
    }

    /**
     * 显示或隐藏窗体
     */
    public void setVisible(boolean visible) {
        window.setVisible(visible);
    }

    /**
     * 关闭界面 回退首页
     *
     */
    public void close() {
        window.dispose();
        Main.setStatus(0);
    }
}
